package persistencia;

import java.sql.Connection;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import modelo.Anulacion;
import modelo.Boleta;
import modelo.Caja;
import modelo.DetalleBoleta;
import modelo.Productos;
import modelo.ProductosMasVendidos;

/**
 *
 * @author Felipe
 */
public class VentasBean {

    private ProductoDAO prodDao;
    private DetalleBoletaDAO detBolDao;
    private BoletaDAO bolDao;
    private AnulacionDAO anuDao;

    public VentasBean(Connection conexion) {
        prodDao = new ProductoDAO();
        prodDao.setConexion(conexion);
        detBolDao = new DetalleBoletaDAO();
        detBolDao.setConexion(conexion);
        bolDao = new BoletaDAO();
        bolDao.setConexion(conexion);
        anuDao = new AnulacionDAO();
        anuDao.setConexion(conexion);
    }

    public Caja realizarVenta(BoletaDetalleComposite bdc, int rutUsuario, int desc, Caja caja) {
        int total = 0;
        Date fecha = new Date();
        bdc.getBoleta().setCodBoleta(bolDao.getCodBol());
        int codBol = bdc.getBoleta().getCodBoleta();
        for (DetalleBoleta de : bdc.getListaDetalle()) {
            de.setCodBoleta(codBol);
            detBolDao.Insertar(de);
            total = total + (de.getCantidad() * de.getPrecio());
            System.out.println("subtotal: " + (de.getCantidad() * de.getPrecio()));
            this.restarStock(de.getCodProducto(), de.getCantidad());
        }
        int monto = (caja.getMontoFinal() + (total - desc));
        System.out.println("TOTAL BOLETA" + total);
        bdc.getBoleta().setTotalVenta(total - desc);
        bdc.getBoleta().setRutUsuario(rutUsuario);
        bdc.getBoleta().setFecha(fecha);
        bdc.getBoleta().setDescuentos(desc);
        bdc.getBoleta().setEstado(true);
        bolDao.Insertar(bdc.getBoleta());
        caja.setMontoFinal(monto);
        return caja;
    }

    private void restarStock(String codProducto, int cantidad) {
        Productos registro = prodDao.buscar(codProducto);
        prodDao.cambiarStock(codProducto, registro.getStockActual() - cantidad);
    }

    public int AnularBoleta(int codigo, int rutUsu, String obs) {
        int cantidad = 0;
        if (anuDao.buscarPorBoleta(codigo) != null) {
            return cantidad = 0;
        } else {
            int cod = anuDao.getCodAnu();
            Date fecha = new Date();
            Anulacion anu = new Anulacion();
            anu.setCodBoleta(codigo);
            anu.setCodUsuario(rutUsu);
            anu.setCodAnulacion(cod);
            anu.setFecha(fecha);
            anu.setObservacion(obs);
            anuDao.Insertar(anu);

            Collection<DetalleBoleta> detalle = detBolDao.buscarTodosPorCodBol(codigo);
            for (DetalleBoleta de : detalle) {

                this.SumarStock(de.getCodProducto(), de.getCantidad());
            }
            bolDao.anular(codigo);
            Boleta bol = bolDao.buscar(codigo);
            cantidad = bol.getTotalVenta();
            return cantidad;
        }
    }

    private void SumarStock(String codProducto, int cantidad) {
        Productos registro = prodDao.buscar(codProducto);
        prodDao.cambiarStock(codProducto, registro.getStockActual() + cantidad);
    }

    public Collection<Boleta> buscarPorDia(Date fechita) {
        Collection<Boleta> boletas = bolDao.buscarEntreFechas(fechita, fechita);
        return boletas;
    }

    public Collection<Boleta> buscarEntreFechas(Date fechita, Date fecha) {
        Collection<Boleta> boletas = bolDao.buscarEntreFechas(fechita, fecha);
        return boletas;
    }

    public Collection<ProductosMasVendidos> masVendidos(Date fechaI,Date fechaf) {
        
        
        Collection<ProductosMasVendidos> mas = detBolDao.buscarMasVendidosEntreFechas(fechaI, fechaf);
        return mas;

    }

    public Collection<Boleta> buscarPorRut(int rut) {
        Collection<Boleta> boletas = bolDao.buscarPorRut(rut);
        return boletas;

    }

}
